הנא חמש מיתוסים על md5 או למה כדאי לא להשתמש בו.
1. md5 זו הצפנה.
2. אפשר לפרוץ md5.
3. פרצו את md5. צריך להפסיק להשתמש בו.
4. שתי מחרוזות שונות יכולות להיות עם hash זהה.
5. sha1 יותר מאובטח, עדיף להשתמש בו.
1. md5 זו הצפנה
מיתוס ראשון ולא מדויק. md5 היא לא הצפנה. נכון שהפלט שלה מוזר ושונה מהקלט ואפילו אי אפשר להבין אותו, אבל התוצאה של הפלט לא ניתנת לשחזור ולא ניתן לקבל את המקור ההתחלתי.
md5 היא פונקציית גיבוב, או בעברית פשוטה, פונקציה חד-כיוונית שאורך הפלט שלה קבוע (ותמיד שווה ל-32 תווים) והיא אינה תלויה באורך הקלט. היא מחשבת עבור הקלט חותמת ייחודית המאפיינת אותו. רק לקלט הזה תהיה את אותה החותמת. עבור כמעט כל קלט אחר התוצאה תהיה שונה. תכף נראה מתי לא.
2. אפשר לפרוץ md5
אי אפשר לפרוץ md5. היא פונקציה חד-כיוונית שלא ניתנת להפיכה (הוכח מתמטית).
אם תגידו לי: "מה פתאום, ראיתי את האתר md5crack.com, הוא פורץ md5", אתם תהיו צודקים, אבל במעט.
במקום לפרוץ אותה, האתרים האלה עושים דבר חכם אחר. הם יוצרים טבלה חדשה עם שתי שדות text ו-its_hash. לאחר מכן לוקחים כמה מחשבים ומריצים עליהם לולאות אין-סופיות שמבצעות את הפונקציה md5 על קלטים שונים. תחילה על מילים ממילון, ואחר-כך על צירופי אותיות שרירותיים.
לאחר כמה חודשים יש להם טבלה גדולה מאוד שמכילה זוגות של חותמות md5 וערכים התחלתיים שישתמשו בהם לקבלת אותה החתימה (hash).
אגב, טבלאות כאלו נקראות rainbow tables.
3. פרצו את md5. צריך להפסיק להשתמש בו.
לא נכון ונכון. נכון שאם יש לכם את הסיסמה 123456, החתימה (hash) שלה כבר מזמן רשומה בטבלאות של הפורצים. בשביל לפתור בעיה זו נהוג לשמור את הסיסמאות של המשתמשים במסד בצירוף טקסט רנדומלי כלשהו.
במקום לשמור במסד תוצאה של md5(123456) אנחנו שומרים תוצאה של
md5(123456 + thjkrc7$%^*0). סביר להניח שאת החתימה (hash) של 123456 + thjkrc7$%^*0 עדיין אין להם בטבלאות.
כדי לקבל את ה-hash של כל סיסמה אפשרית באורך 15 תווים המורכבת מ-52 אותיות אנגליות גדולות וקטנות, עוד 10 ספרות ועוד 10 תווים מוזרים כמו דולר - יהיה צורך בטבלה בגודל 72 בחזקת 15 רשומות (7244150201408990671659859968). נניח שהמחשב שלכם מסוגל לחשב 3000 רשומות בשניה. כדי לקבל טבלה עם רשימה כזאת של אפשרויות יהיה צורך בכמה שנים.
עם זאת, לא הייתי ממליץ להשתמש ב-md5 וגם לא במשהו מתקדם יותר כמו sha1 לגיבוב סיסמאות, מכייון שראשית, מעטים משתמשים בסיסמאות בנות 15 תווים ושנית, ל-md5 יש בעיה קריטית אחת.
4. שתי מחרוזות שונות יכולות להיות עם hash זהה.
הפעם נכון. יותר מזה, מתמטיקאי סיני אחד הוכיח (והראה) שלמחרוזות מסוימות אפשר למצוא את המחרוזת המקבילה שתייצר את אותו ה-hash בכמה שניות. האם זה עוזר לפורצים? יכול, בהחלט.
ל-md5 יש בעיה קריטית אחת - החישוב שלה מהיר מדי. איך זו בעיה? היום כרטיס גרפי אחד שמותקן במחשב מסוגל לעשות עבודה של 120 מעבדים רגילים. קופסת מחשב אחת בלבד מסוגלת להוציא כמות נסיונות מטורפת בשניה. קופסה עם כמה כרטיסים גרפיים או כמה כופסאות מחשב כאלו הופכות מציאת מחרוזת שתייצר hash מסוים לתהליך לא ארוך במיוחד.
גם אם המחרוזת שתימצא לא תהיה בדיוק הסיסמה והמלח שלך, באמצעות האלגוריטם הסיני ימצאו עוד כמה מחרוזות שמייצרות את אותו ה-hash ואחת מהן בהחלט תהיה הסיסמה וה-hash שלך. אם הפורץ רשום למערכת שלך ויודע את הסיסמה שלו ואת ה-hash המיוצר ממנה - הוא יכול להקל על עצמו עוד יותר. מספיק לו למצוא את המלך שיתווסף לסיסמה שלו ומשם למצוא סיסמה של כל משתמש אחר לא תהיה בעיה גדולה.
את הבעיה האחרונה אפשר לפתור על ידי שימוש בhash שונה עבור כל משתמש. את הבעיה הראשונה אפשר לפתור על ידי שימוש באלגוריטם אחר, איטי יותר.
5. עדיף להשתמש ב-sha1 במקום
לא נכון.
למען הדיוק, נכון חלקית. sha1 עדיפה על פני md5, אבל נשארת עם בעיות זהות. sha1 לא מספיק איטית או קשה לחישוב ויש פונקציות אחרות שעדיפות הרבה יותר, לדוגמה bcrypt. מעבר לזה, החל מגרסת php 5.5 הוספו לשפה שני פונקציות חדשות שמיועדות לגיבוב ואבטחת סיסמאות.
תוכל ללמוד על עבודה נכונה עם סיסמאות במדריך הזה.
תגובות לכתבה:
MD5 היא באמת "שיטת גיבוב" טובה מאוד! לא ידעתי על המיתוסים האלה, וה-salt חדש לי...
שמח שעזרתי לך :-)
1. איך שלא תקרא לזה, סופו של דבר זה משבש את המחרוזת = מצפין,
- אתה יכול לקרוא לזה משבש מחרוזות מבחינתי.
2. אף אחד לא אמר שאפשר לפרוץ את זה,
- אבל קיימים היום מאגרים גדולים מאד של סיסמאות נפוצות "פרוצות" (זו מילה לא מדוייקת).
3. עיין ערך 2.
4. רעיון שלא חשבתי עליו אני אתחיל להשתמש בסלט בנוסף לSHA1.
5.אני לא יודע איך מדדת מהירויות, אבל מי אני שאחלוק עליך,
פלט קצר יותר - לא בהכרח טוב יותר או יעיל יותר.
אשמח לתשובות, ותודה על המאמר והאתר בכלל.
היי אבי. תודה על התגובה
א. הצפנה היא "שיבוש מחרוזת" בעזרת צופן כלשהו עם מפתח שמיועד להיות מתורגם עד ידי המקבל לטקסט קריא. המטרה הייתה להדגיש ש-md5 לא ניתנת להיפוך ושחזור המקור.
ב. הכן קיימים מאגרים גדולים. כמה שנים צריך כדי ליצור מאגר שמכיל כל מחרוזת אפשרית המורכבת מ-15 תווים ראית לבד. רק שים לב, מאגרים זהים קיימים גם עבור sha1
ג. פלט קצר יותר לוקח פחות מקום במסד, פחות זמן להעברה ברשת ובכלל פחות תעבורה.
מהירות הmd5 טובה יותר כיוון שפחות חישובים מתמטיים ולולאות משמשות לחישוב ה-hash של md5 (לפי וויקי 64 שלבים) לאומת sha1 (סהכ 80 שלבים)
1. אז אולי זה לא השם המדוייק אבל מי שקורה לזה הצפנה לא
- טועה, כי ברוב המקרים הוא פשוט לא חשב על ההבדלים
- (שכרגע אני מסכים איתם לאחר שנתת חומר למחשבה)
2. ברור שהמאגרים לא מושלמים אבל תחשוב על ה"משתמש
- הטיפש" שיכתוב '123456', והמאגרים של SHA1
- קטנים בהרבה (לעניות דעתי)
3. זה רלוונטי רק עבור אתרים גדולים מאד שכל בייט שווה
- נפח עצום בתעבורה ביום אתרים כמו 'גוגל' 'פייסבוק' ואפילו
- 'FXP' אבל בהחלט לא כל אתר,
4. האם אתה משתמש בMD5? כמה זמן? והאם בעבר השתמשת
- בSHA1? מה גרם לך לעבור?
תודה, אבי.
2. זה לא המשתמש הטיפש אשם, אלה המתכנת הטיפש אשם, שלא רשם את הסיסמה במסד ביחד עם salt.
המאגרים של sha1 לא בהרבה יותר קטנים, אבל אתה יכול להיות בטוח שהם כוללים את כל המילים של השפה האנגלית ואת כל המספרים מאחד עד 999 999 999 לפחות.
sha1 של 123456 נמצא שם גם :)
3. האמת היא שלא ממש רק לאתרים גדולים. גם עבור אתר קטן עם מעט רשומות בכל זאת שליפות לפי מחרוזות קצרות יותר יתבצעו מהר יותר. אפילו אם לא תיקח בחשבון את הנפח, כיוון שהמחירים של נפח דיסק, בימינו, מזעריים.
4. אני משתמש ב md5 לשמירת נתונים אצלי, כיוון שגם אם תקבל העתק של המסד שלי, כל הסיסמאות שם עם salt ואין לך מה לעשות איתם.
אולם דברים שאני שולח ברשת לשירותים אחרים, או כאימות נתונים, אני מעדיף את sha1 כיוון שבמקרה הזה אני כן עשוי להיות חשוף למקרים שבהם הסיניים ימצאו זוג מחרוזות שנותנות את אותו ה-hash.
תודה על התגובה,
מדבריך אני מסיק שבתקשורת בין שרתית עדיף
להשתמש בSHA1, הבנתי נכון?
אני פשוט בפרוייקט קטן כזה,
תודה רבה.
הכוונה היא לא לתקשורת בין שרתית, אלה לאימות נתונים גלויים.
למשל שנינו מסכימים על סיסמה סודית בינינו:
pass = 12345
עכשיו אתה יכול לעביר לי מידע באופן גלוי בצורה הזאת:
something=value&checksum=md5(value.pass); //e
כשאני יקבל את הטקסט הזה אני יוכל לקרוא את value, ואחרי זו אוכל לוודא שאף אחד לא שינה את הערך ואתה הייתה זה שכתבת אותו כשאני יבדוק האם
md5(_GET[value].pass) == _GET[checksum] //e
כיוון שליצור checksum נכון יכול רק מי, שיודע את הpass
אתה רוצה להעביר לי את המילה שלום,
אתה שולח לי את הנתונים הבאים: data=hello
אני מקבל אותם וקורא את המילה. אבל,
אין לי דרך לוודא שאתה הייתה זה, ששלח אותה ושאף אחד לא שינה אותה בדרך
כדי שאני יוכל לדעת שאף אחד לא שינה את הטקסט והוא נוצר על ידך
אתה יכול לשלוח לי ביחד עם הטקסט עצמו גם hash של הנתונים
data=hello&hash=sha1(hello) //e
אבל זה לא מספיק, כיוון שאם משהו ירצה לשנות את זה, ישנה גם את ה-hash בהתאם.
כדי שלא תהיה לו האפשרות לעשות את זה, את ה-hash תיצור מהנתונים ומסיסמה שרק אני ואתה יודעים.
data=hello&hash=sha1(hello + secret1) //e
אדם חיצוני יוכל לשנות את ה-data אך לא יוכל לשנות את ה-hash למשהו לגיטימי, כיוון שאינו יודע את הסיסמה.
אני, בתורי, כשאקבל את הנתונים האלה, ייצור מהם hash בעצמי עם הסיסמה שאני מכיר ויבדוק אם הוא תואם ל-hash שאתה יצרת.
אם כן, אף אחד לא שינה את הנתונים ואתה שלחת אותם.
אם לא, משהו מנסה לפברק אותם. נו-נו-נו!
וואלה, אף פעם לא חשבתי על זה.. רעיון גדול :)...
יש לך אולי דוגמה למה זה שימושי?
תודה רבה, וסליחה על ההטרדה :).
שימושי לרשום נתונים לקוקי ולוודא אחר כך שהמשתמש לא שינה אותם.
וואו אלכס, תודה רבה, לימדת אותי משהו חדש. :)
ממש נחמד! :]
יפה מאוד ,
תודה על הפרסום.:)
תודה רבה לך,
למדתי כמה דברים שלא ידעתי :)
בסך הכל חשיבה יצירתית ואתם תגיעו לתוצאות גדולות בהרבה
סה"כ נחמד ביותר.
לגבי sha1 - צחקתי. אז מה שזה יותר איטי? ממתי מעדיפים מהירות על פני ביטחון? כמובן ש-md5 יתאים לאתר של ילד בחטיבת ביניים. ניתן לראות בנצ'מארקים ע"י חיפוש מהיר בגוגל של עמידות סוגי ההצפנות הללו לאורך השנים. תגלו ש-md5 זה לא האס.
לגבי ה"מלח" (salt). אתה יכול להשתמש אפילו בהליט - זה לא ישנה כלום. ה"מלח" חסר אונים מול התקפות "כוח גס" ו"התקפות מילוניות". בנוסף לכך, זה לא ישפיע כלל במצב שלפורץ יש גישה למסד נתונים.
לסיכום, לפרויקטים רציניים השתמשו ב-bcrypt.
אגב סרברים מודרניים כיום יכולים לחשב בערך 330 מגה בשנייה מה שאומר שסיסמאות בתווח של 6 תווים ניתנים לפריצה ב-40 שניות פחות או יותר.
כמובן שבכללי שימוש במלח מומלץ אך זה לא פתרון לכל הבעיות.
בגדול אתה צודק וזה נכון למקרה שלא מדובר ב web.
מול התקפות כוח גם (וביניהם התקפות מילון) כל הצפנה שהיא תעמוד באופן זהה. או שהסיסמה תמצא במילון, או שהיא לא תמצא.
נכון שעבור md5 יותר קל למצוא קוליזיה (שני קלטים שנותנים אותו פלט) מאשר ל sha1. העניין הוא שגם אם תמצא אחת כזאת - לא תוכל להזדהות עם הקוליזיה בתור סיסמה באתר.
לדוגמה נניח ששני המחרוזות הבאות נותנות את אותו md5:
abcmysupersalt
xyz12345678901
המשתמש בוחר לו בטור סיסמה את האותיות abc
הסקריפט מוסיף לזה את mysupersalt ומכניס למסד.
אתה מקבל העתק של המסד, מוצא שהקלט xyz12345678901 זהה לזה שרשום במסד ומנסה להתחבר איתו לאתר. הסקריפט בעת הבדיקה מוסיף לזה את mysupersalt ובודק האם
md5(qyz1234567890mysupersalt) t שווה למה, שרשום במסד — ומסתבר שלא. ההזדהות לא הצליחה. חבל.
בנוגע לזמן החישוב, אתה צודק לגמרי בזה שמחשבים של היום די מהירים. כדי שנדבר על אותם סרברים ויחידות מדידה של פעולות בשניה - בו ניקח את מחשב העל Tianhe-1A
שמסוגל לבצע 2.556e15 פעולות בשניה.
חישוב md5 זה בערך 70 פעולות.
כלומר הוא מסוגל לחשב 36514285714285 חשים בשניה.
סיסמה של 15 תווים זה 7244150201408990671659859968 חשים לבדוק (כשידוע שזה בדיוק 15 והוא לא יבדוק לפני את האם זה אולי סיסמה של 14 תווים).
כלומר ייקח למחשב העל למצוא את הסיסמה שלך ב brute force בערך 6290976 שנים.
ונכון של sha1 יש טיפה יותר אפסים בכמות השנים, אבל מה זה משנה :-)
אתה גם צודק בזה שהרבה חוקרים, מתמטיקאים ואנשים אחרים מנסים, מציאים פרסים וכסף ואפילו שוברים פה ושם את md5. האם היא נשברה עד הסוף - עוד לא.
האם אתה מאמין בזה שישברו אותה? אתה יכול בשמחה להשתמש בכל דבר אחר. הרי אחרי זמן מסוים והתפחות המחשבים גם את sha1 ישברו מכיוונים מסוימים וגם לה ימצאו קוליזיות או preimageים וגם לbcrypt ולכל דבר אחר מתישהו גם ימצאו.
כמובן שישברו. זה בודאות עניין של זמן. אותם המחשבים של אי-בי-אם - פשוט מכונות אל. העיין הוא, שעם ההתקדמות הטכנולוגית, יש צורך גם בקידום בטחון המשתמשים. אז בוא נתחיל לפחות מזה ש-sha1 עדיף על md5. זה למתכנתים שאינם יודעים על כך שקיימים דברים יפים כמו bcrypt שכוללים בתוכם כבר את אותו ה"מלח" שהזכרת. אני לא מנסה לומר ש-md5 זה גרוע. אך בוא נאמר, שהאווירה שיצרת בכתבה שלך היא אווירה של ביטחון רב וזה לא לצערי. כפי שכבר אמרתי, למתחילים וגם לאנשים שבונים אתרים לא רציניים זה בסדר לגמרי להשתמש במה שכתבת. אך יחד עם זאת, צריך להעלות את המודעות של האנשים לשיטות אחרות, יותר בטוחות למקרה שהם ירצו לבנות פרוייקטים גדולים יותר.
הפוסט הזה נוצר כתגובה לקריאות רבות בכל מיני פורומים בסגנון "פרצו הכל","לשמור את הסיסמה בארנק יותר מאובטח מ md5" והפניקה המיותרת מסביב.
מבחינתי הכתבה הכן עונה על הטענה שmd5 כבר נפרצה ועל הטענה ש sha1 בהרבה יותר בטוחה. זה לא ככה _כרגע_. אמנם מי שיקרא גם את התגובות האלה יקבל את התמונה יותר המלאה.
אני מסכים אתך לגמרי ואין ספק שבסוף ישברו הכל ועם התקדמות הטכנולוגית יש להתקדם גם באלגוריתמי ההצפנה. עדכנתי מעט את הכתבה והוספתי לה עוד פיסקה.
נ.ב. לא בטוח עד כמה זה נכון, אבל שמעתי משני מקורות שונים ש blowfish עם הצפנה של יותר מ128 ביט נופלת תחת הגבלות מסוימות ואיסורים בחוק בעולם.
כיום ניתן גם לשלב כמה מחשבי על . על מנת לפרוץ האש .. עכשיו תחשב שאם הfbi השתמשו במחשב העל שציינת כפול אלף
כמה שאלות:
1. מתכנת פשוט, לא יכול ליצור הצפנה מסוג כזאת? אני מניח שיש תבנית לאיך שבנו את זה, אז פשוט אם משנים אות או מספר זה יכול לגרום לכול העיניין ליצור סוג הצפנה חדש, ובעצם כמעט שום מאגר בעולם לא יוכל לפענח את הסיסמה... מכיוון שזה נעשה אישי
2. החברות הגדולות (גוגל, יאהו, פייסבוק וכו') במה משתמשות?
3. כדי ליצור את זה, המחשב/ השרת קורא את זה מאיזה ספרייה מסויימת (נניח קובץ DLL?) אם אינני טועה. אז למה עדין לא הצליחו למצוא בזה פירצה? הרי אם היו רואים את הקוד מקור של זה (ואני מאמין שכבר ראו) למה אי אפשר לעשות פעולות הפוכות לזה?
1. תלוי מה זה מתכנת פשוט. צריך קצת נסיון וקצת ידע במתמטיקה.
2. באותו דבר. אולי ב sha256
3. האלגוריטם הוא חד כיווני בגלל הפעולות המתמטיות שלו. למשל הפעולה "חזקה" היא פעולה בלתי הפיכה. אין פעולה כזאת בטבע - שורש. הפעולה "שורש" היא פעולה של חיפוש מספר. המחשב לא יודע לחשב שורש מ 10. הוא מנסה את את 3, זה יוצא מעט מדי, הוא מנסה את 4, זה יוצא הרבה מדי, הוא מנסה 3.5.
וככה עד שהוא יימצא.
באלגוריטמים הלאה משתמשים בהרבה פעולות מתמטיות בלתי הפיכות, ככה שלמצוא את הערך המקורי שיביא לאותה תוצאה מאוד קשה מבחינה חישובית וזה לוקח המון זמן.
בתגובה לאלכס מעליי:
מציאת שורש ריבועי למספר, גדול ככל שיהיה, היא פעולה קלה שניתנת לביצוע באמצעות דף ועט.
אני לא יודע אם גם קיימות שיטות יעילות גם למציאת שורש מסדר גדול מ-2, בלי להתחיל לחפש את המספר, אבל רק רציתי להבהיר. :)
שורש דווקא לא פעולה כזאת מסובכת. היא דוגמה לפעולה שלא באמת קיימת בטבע ומצריכה רצף של פעולות מתמטיות אחרות כדי לחשב אותה,
ככה שנוצר מצב שפעולה מסוימת לוקחת X זמן והפעולה ההפוכה שלה לוקחת הרבה יותר. על זה מבוססת כל הקריפטוגרפיה המודרנית.
האם אפשר להצפין סיסמאות עם מה שlulzsec הציע ? (פונקציה crypt).
כמובן, תקרא בדוקומנטציה .
לא רק אפשר, אלה צריך ויש דוגמה בסוף המדריך איך לעשות את זה.
מצויין, תודה :)
יש כאן טעות קטנה כי זה לא נכון להגיד שלצורך פענוח יש צורך בטבלה בגודל 72 בחזקת 15 רשומות
בפועל יש רק 16 תווים בהקסדצימלי ו md5 יוצרת מחרוזת בעלת 32 תווים
כך שלמעשה לא ניתן לספק יותר מ 32^16 מחרוזות יחודיות ופשוט יהיו מחרוזות מסוימות שיחזרו על עצמן
אני משתמש בשניהם עם slat כדי שיהיה יותר קשה לזהות כי צריך לנחש מה ראשון מה שני וכו' וגם עם salt ככה שיותר קשה אפילו.
שנתיים וחצי אחרי, שום דבר ממה שכתוב פה לא אקטואלי ויש בעיות קריטיות גם עם md5 או משהו יותר קשה כמו sha1/256. גם אם אתה משתמש במלח.
ערכתי קצת
מה הבעיה הקריטית שלה?
"ל-md5 יש בעיה קריטית אחת - החישוב שלה מהיר מדי"
אה, למה זה בעיה?
>>
ל-md5 יש בעיה קריטית אחת - החישוב שלה מהיר מדי. איך זו בעיה? היום כרטיס גרפי אחד שמותקן במחשב מסוגל לעשות עבודה של 120 מעבדים רגילים. קופסת מחשב אחת בלבד מסוגלת להוציא כמות נסיונות מטורפת בשניה. קופסה עם כמה כרטיסים גרפיים או כמה כופסאות מחשב כאלו הופכות מציאת מחרוזת שתייצר hash מסוים לתהליך לא ארוך במיוחד.
<<
קודם כל, אחלה של הסבר! ממש אהבתי!
חשבתי על פתרון קטן - למה לא להשתמש בשתי המגובבים? כאילו להכניס פלט ל-md5 ואז להעביר את התוצר של ה-md5 דרך sha1? אני לא חושב שאתר הצפנה יוכל לעקוף את זה... (תקן אותי אם אני טועה).
בכל מקרה, תודה על ההסבר!
במקרה הזה באתר rainbow tables אחד אתה מחפש את המקור שהכניסו לפונקציה החיצונית
ואחרי זה באתר אחר אתה מחפש את המקור שהכניסו לפונקציה הפנימית כשאתה יודע את התוצאה שלה.
אבל למה להסתבך? יש קישור גדול בסוף הכתבה שמוביל להסבר טוב למה md5 ו sha1 לא שוות משהו וגם מה לעשות עם זה.